package com.xuetang9.shopping.commons.format;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.springframework.format.Formatter;

// 这个泛型只有一个参数, 表示目标类型
// 实现formatter, 需要实现两个方法, 它比Converter强大
// 可解析页面数据, 可解析后台数据
public class DateFormatter implements Formatter<Date> {
	private String[] datePattern;
	private String checkedPattern;

	// 初始化日期格式
	public DateFormatter(String[] patterns) {
		this.datePattern = patterns;
		for (int i = 0; i < datePattern.length - 1; i++) {
			for (int k = i + 1; k < datePattern.length; k++) {
				// 升序
				if (datePattern[i].length() > datePattern[k].length()) {
					String temp = null;
					temp = datePattern[i];
					datePattern[i] = datePattern[k];
					datePattern[k] = temp;
				}
			}
		}
	}

	// 返回页面要显示的String值, 参数为后台要解析的Date数据
	@Override
	public String print(Date date, Locale arg1) {
		if (date == null) {
			return "";
		}
		
		// 由于并不知道使用哪种转换类型(yyyy-MM-dd / yyyy-MM-dd hh:mm:ss)
		// 所以使用一个变量来保存 选择的一种格式
		DateFormat format = new SimpleDateFormat(checkedPattern);
		String str = format.format(date);
		return str;
	}

	// 返回后台要使用的Date数据, 参数value为页面传递而来的数据
	@Override
	public Date parse(String value, Locale arg1) throws ParseException {
		// 如果value为空
		if (value == null || value.length() == 0) {
			return null;
		}

		Date date = null;
		// 循环日期格式
		for (String pattern : datePattern) {
			DateFormat format = new SimpleDateFormat(pattern);
			try {
				date = format.parse(value);
				// 只要上句没有异常, 则把可以选择此种方式 作为表单回显的格式
				checkedPattern = pattern;
				break;
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}

		// 判断date是否为空
		if (date == null) {
			String message = "";
			for (String m : datePattern) {
				message += m;
			}
			throw new RuntimeException("日期格式必须是: " + message);
		}
		return date;
	}

}
